﻿Public Class frmExamensMAJ
    Public pType_exam As String
    Public pDate As Date
    Public pNo_exa As Integer
    Public pAgence As Integer

    Private szSQL As String
    Private rs As ADODB.Recordset
    Private rsEleve As ADODB.Recordset = Nothing
    Private rsFormule As ADODB.Recordset = Nothing
    Private rsPermis As ADODB.Recordset = Nothing
    Private rsCompte As ADODB.Recordset = Nothing
    Dim nbPresPratGratuit As Integer
    Dim nbPresTheoGratuit As Integer
    Dim szRefADebiter As String
    Dim mtDebit As Decimal
    Dim szIntitule As String
    Private m_SortingColumn As ColumnHeader
    Private m_SortingIndex As Integer = 0

    Private Sub frmExamensMAJ_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        InitComboAgences(CB_AGENCES)
        InitComboLieux(CB_LIEUX, "EX")
        InitComboSocietes(CB_SOCIETES)
        InitComboStatutsExam(CB_RESULTAT)
        TC_EXAMENS.SelectedIndex = 0

        ExamenToScreen()
        InitListeInscrits(0)

        ' interdire MAJ si examen validé
        If chkVALIDE.Checked Or gUserAcces < 6 Then
            BO_SAVE.Enabled = False
            BO_SUPPRIMER.Enabled = False
            BO_RECH_INSP.Enabled = False
            BO_RECH_MON.Enabled = False
        Else
            BO_SAVE.Enabled = True
            BO_SUPPRIMER.Enabled = True
            BO_RECH_INSP.Enabled = True
            BO_RECH_MON.Enabled = True
        End If

    End Sub

    Private Sub TC_EXAMENS_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TC_EXAMENS.SelectedIndexChanged

        Select Case TC_EXAMENS.SelectedIndex
            Case 0  ' tab Inscription
                ExamenToScreen()
                InitListeInscrits(0)

                ' interdire MAJ si examen validé
                If chkVALIDE.Checked Or gUserAcces < 6 Then
                    BO_SAVE.Enabled = False
                    BO_SUPPRIMER.Enabled = False
                End If

            Case 1  ' tab bordereau
                ' utilisateur autorisé ?
                If gUserAcces < 6 Then
                    TC_EXAMENS.SelectedIndex = 0
                    Exit Sub
                End If
                InitListeBordereau(0)

            Case 2  ' tab résultats
                ' utilisateur autorisé ?
                If gUserAcces < 6 Then
                    TC_EXAMENS.SelectedIndex = 0
                    Exit Sub
                End If
                InitListeResultats(0)
                ' cacher les détails 
                TC_DETAILS.Visible = False
                chkVALIDE_CheckedChanged(sender, e)

        End Select

    End Sub

    Private Sub ExamenToScreen()

        ' Lire l'enreg sélectionné
        szSQL = "CALL spGet_EXAMENS_byNO_EXA('" & Format(pDate, "yyyy/MM/dd") & "'," & pNo_exa & "," & pAgence & ")"
        GetRecordset(ctDSN_AEM, szSQL, rs)
        If rs.RecordCount > 0 Then
            TE_DATE.Value = rs.Fields("date").Value
            TE_HEURE.Value = rs.Fields("heure").Value
            TE_NO_EXA.Value = rs.Fields("no_exa").Value
            TE_CLE.Text = rs.Fields("cle").Value
            CB_LIEUX.SelectedIndex = CB_LIEUX.FindString(nv(rs.Fields("lieu").Value))
            TE_ADRESSE.Text = nv(rs.Fields("adresse").Value)
            CB_SOCIETES.SelectedIndex = CB_SOCIETES.FindString(rs.Fields("societe").Value)
            CB_AGENCES.SelectedIndex = Val(rs.Fields("agence").Value) - 1
            TE_TOTAL.Value = rs.Fields("total").Value
            TE_INSCRITS.Text = rs.Fields("total").Value - rs.Fields("inscrits").Value
            chkVALIDE.Checked = rs.Fields("valide").Value
            TE_CD_MON.Text = nv(rs.Fields("cd_mon").Value)
            TE_INSPECTEUR.Text = nv(rs.Fields("inspecteur").Value)
            TE_MODIFIE_LE.Text = setModifiedBy(rs.Fields("cree_le").Value, rs.Fields("modif_le").Value, rs.Fields("cd_uti").Value)
        End If
        rs.Close()
        ' Lire le nom du MONITEUR
        If TE_CD_MON.Text.Length > 0 Then
            szSQL = "CALL spGet_MONITEURS('" & TE_CD_MON.Text & "')"
            GetRecordset(ctDSN_AEM, szSQL, rs)
            If rs.RecordCount > 0 Then
                TE_NOM_MON.Text = rs.Fields("nom").Value
            Else
                TE_NOM_MON.Clear()
            End If
            rs.Close()
        End If

    End Sub

    Private Sub InitListeInscrits(ByVal ix As Integer)

        Dim rsEleve As ADODB.Recordset = Nothing
        Dim nb As Integer = 0
        Dim nbUnite As Integer = 0
        Dim permis_demande As String = ""

        ' effacer la listview
        LV_INSCRITS.Items.Clear()
        LV_INSCRITS.ListViewItemSorter = Nothing

        ' Lire la table EXAMENS_AFF
        szSQL = "CALL spGet_EXAMENS_AFF('" & Format(pDate, "yyyy/MM/dd") & "'," & pNo_exa & "," & pAgence & ")"
        GetRecordset(ctDSN_AEM, szSQL, rs)

        ' Load the data.
        Do While Not rs.EOF
            LV_INSCRITS.Items.Add(Format(rs.Fields("cree_le").Value, "dd/MM/yyyy"))
            LV_INSCRITS.Items(nb).SubItems.Add(nv(rs.Fields("cd_cli").Value))
            LV_INSCRITS.Items(nb).SubItems.Add(nv(rs.Fields("nom").Value))

            ' Lire la fiche Eleves
            szSQL = "CALL spGet_ELEVES_byCD_CLI(" & nv(rs.Fields("cd_cli").Value) & ")"
            GetRecordset(ctDSN_AEM, szSQL, rsEleve)
            If rsEleve.RecordCount > 0 Then
                ' calcule le solde
                LV_INSCRITS.Items(nb).SubItems.Add(Zero2Space(rsEleve.Fields("credit").Value - rsEleve.Fields("debit").Value))
                permis_demande = rsEleve.Fields("permis_demande").Value
            Else
                LV_INSCRITS.Items(nb).SubItems.Add("")
                permis_demande = " "
            End If
            LV_INSCRITS.Items(nb).SubItems.Add(rs.Fields("unite").Value)
            LV_INSCRITS.Items(nb).SubItems.Add(permis_demande & " " & rs.Fields("indice").Value)
            LV_INSCRITS.Items(nb).SubItems.Add(rs.Fields("cd_uti").Value)
            LV_INSCRITS.Items(nb).SubItems.Add(nv(rs.Fields("cd_mon").Value))
            LV_INSCRITS.Items(nb).SubItems.Add(rs.Fields("no_insc").Value)
            LV_INSCRITS.Items(nb).SubItems.Add(nv(rs.Fields("filiere").Value))
            If rs.Fields("valide").Value Then
                LV_INSCRITS.Items(nb).ForeColor = Color.Green
            End If
            nbUnite += rs.Fields("unite").Value
            nb += 1
            rs.MoveNext()
        Loop
        ' Close the recordset AND connection.
        rs.Close()
        TE_INSCRITS.Value = TE_TOTAL.Value - nbUnite
        ' restaurer l'ancienne ordre de tri de la listview
        If m_SortingIndex > 0 Then
            SortListView(LV_INSCRITS, m_SortingColumn, m_SortingIndex)
        End If
        ' restaurer la position du curseur avant le init
        setIndice(ix, LV_INSCRITS)

    End Sub

    Private Sub LV_INSCRITS_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles LV_INSCRITS.ColumnClick
        SortListView(LV_INSCRITS, m_SortingColumn, e.Column)
        m_SortingIndex = e.Column
    End Sub


    Private Sub LV_INSCRITS_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles LV_INSCRITS.DoubleClick

        If LV_INSCRITS.SelectedItems.Count > 0 Then
            frmExamensINS.pNo_exa = pNo_exa
            frmExamensINS.pDate = pDate
            frmExamensINS.pAgence = pAgence
            frmExamensINS.pNoInscrit = LV_INSCRITS.SelectedItems(0).SubItems(8).Text
            frmExamensINS.pTypeExam = pType_exam
            frmExamensINS.pDispo = TE_INSCRITS.Text
            frmExamensINS.ShowDialog()
            InitListeInscrits(LV_INSCRITS.SelectedItems(0).Index)
        End If

    End Sub

    Private Sub LV_INSCRITS_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles LV_INSCRITS.KeyDown

        Select Case e.KeyCode
            ' touche Enter = DoubleClick
            Case Keys.Enter
                LV_INSCRITS_DoubleClick(sender, e)

            Case Keys.Insert
                BO_ADD_LIGNE_Click(sender, e)

        End Select
    End Sub

    Private Sub InitListeBordereau(ByVal ix As Integer)

        Dim rsEleve As ADODB.Recordset = Nothing
        Dim nb As Integer = 0
        Dim nb_g As Integer = 0
        Dim nb_d As Integer = 0
        Dim permis_demande As String = ""
        Dim solde As String

        ' effacer la listview
        LV_BORDEREAU.Items.Clear()
        LV_GAUCHE.Items.Clear()
        LV_DROITE.Items.Clear()

        ' Lire la table EXAMENS_AFF
        szSQL = "CALL spGet_EXAMENS_AFF('" & Format(pDate, "yyyy/MM/dd") & "'," & pNo_exa & ",0)"
        GetRecordset(ctDSN_AEM, szSQL, rs)

        Do While Not rs.EOF
            LV_BORDEREAU.Items.Add(rs.Fields("cd_cli").Value)
            LV_BORDEREAU.Items(nb).SubItems.Add(nv(rs.Fields("nom").Value))

            ' Lire la fiche Eleves
            szSQL = "CALL spGet_ELEVES_byCD_CLI(" & nv(rs.Fields("cd_cli").Value) & ")"
            GetRecordset(ctDSN_AEM, szSQL, rsEleve)
            If rsEleve.RecordCount > 0 Then
                ' calcule le solde
                solde = rsEleve.Fields("credit").Value - rsEleve.Fields("debit").Value
                permis_demande = rsEleve.Fields("permis_demande").Value
            Else
                solde = " "
                permis_demande = " "
            End If
            LV_BORDEREAU.Items(nb).SubItems.Add(solde)
            LV_BORDEREAU.Items(nb).SubItems.Add(rs.Fields("unite").Value)
            LV_BORDEREAU.Items(nb).SubItems.Add(permis_demande & " " & rs.Fields("indice").Value)
            LV_BORDEREAU.Items(nb).SubItems.Add(rs.Fields("cd_uti").Value)
            LV_BORDEREAU.Items(nb).SubItems.Add(rs.Fields("agence").Value)
            LV_BORDEREAU.Items(nb).SubItems.Add(rs.Fields("no_insc").Value)
            If rs.Fields("valide").Value Then
                LV_BORDEREAU.Items(nb).ForeColor = Color.Green
            Else
                If rs.Fields("ordre").Value > 0 Then
                    LV_BORDEREAU.Items(nb).ForeColor = Color.Blue
                End If
            End If

            Select Case rs.Fields("ordre").Value
                Case 1
                    ' colonne de gauche
                    LV_GAUCHE.Items.Add(rs.Fields("nom").Value)
                    LV_GAUCHE.Items(nb_g).SubItems.Add(rs.Fields("unite").Value)
                    LV_GAUCHE.Items(nb_g).SubItems.Add(permis_demande & " " & rs.Fields("indice").Value)
                    LV_GAUCHE.Items(nb_g).SubItems.Add(nv(rs.Fields("no_insc").Value))
                    LV_GAUCHE.Items(nb_g).SubItems.Add(nv(rs.Fields("cd_cli").Value))
                    ' LV_GAUCHE.Items(nb_g).SubItems.Add(rs.Fields("agence").Value)
                    nb_g = nb_g + 1

                Case 2
                    ' colonne de droite
                    LV_DROITE.Items.Add(rs.Fields("nom").Value)
                    LV_DROITE.Items(nb_d).SubItems.Add(rs.Fields("unite").Value)
                    LV_DROITE.Items(nb_d).SubItems.Add(permis_demande & " " & rs.Fields("indice").Value)
                    LV_DROITE.Items(nb_d).SubItems.Add(nv(rs.Fields("no_insc").Value))
                    LV_DROITE.Items(nb_d).SubItems.Add(nv(rs.Fields("cd_cli").Value))
                    ' LV_DROITE.Items(nb_d).SubItems.Add(rs.Fields("agence").Value)
                    nb_d = nb_d + 1
            End Select
            rs.MoveNext()
            nb = nb + 1
        Loop
        ' Close the recordset AND connection.
        rs.Close()
        GB_INSCRITS.Text = "Elèves à contrôler [ " & nb & " ] :"
        GB_GAUCHE.Text = "Colonne gauche [ " & nb_g & " ] :"
        GB_DROITE.Text = "Colonne droite [ " & nb_d & " ] :"
        ' restaurer la position du curseur avant le init
        setIndice(ix, LV_BORDEREAU)

    End Sub

    Private Sub LV_BORDEREAU_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles LV_BORDEREAU.DoubleClick

        ' Examen déjà validé 
        If chkVALIDE.Checked = True Then
            Exit Sub
        End If

        If LV_BORDEREAU.SelectedItems.Count > 0 Then
            ' élève déjà controlé ?
            szSQL = "CALL spGet_EXAMENS_AFF_byNO_INSC(" & LV_BORDEREAU.SelectedItems(0).SubItems(7).Text & ")"
            GetRecordset(ctDSN_AEM, szSQL, rs)
            If rs.RecordCount > 0 Then
                If rs.Fields("ordre").Value > 0 Then
                    ' oui, ne rien faire
                    rs.Close()
                    Exit Sub
                End If
            End If
            rs.Close()

            ' non, effectuer les controles sur l'élève
            If ControlerEleves("EXC", LV_BORDEREAU.SelectedItems(0).Text) = False Then
                Exit Sub
            End If
            ' effectuer les controles sur son examen
            If ControlesExamen("EXC", LV_BORDEREAU.SelectedItems(0).Text, TE_NO_EXA.Text, pDate, pAgence) = False Then
                Exit Sub
            End If

            ' controler le solde de l'élève si non admin
            If gUserAcces < 9 Then
                If ControlerSolde("PREVU", LV_BORDEREAU.SelectedItems(0).Text, pType_exam) = -1 Then
                    Exit Sub
                End If
            End If

            ' controles OK, mettre l'élève dans la colonne de gauche
            szSQL = "update EXAMENS_AFF set ordre=1 WHERE no_insc=" & LV_BORDEREAU.SelectedItems(0).SubItems(7).Text
            ExecQuery(ctDSN_AEM, szSQL)
            ' réafficher les listviews
            InitListeBordereau(0)
        End If

    End Sub

    Private Sub LV_BORDEREAU_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles LV_BORDEREAU.KeyDown
        If e.KeyCode = Keys.Enter Then
            ' touche Enter = DoubleClick
            LV_BORDEREAU_DoubleClick(sender, e)
        End If
    End Sub

    Private Sub BO_ELEVE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        If LV_BORDEREAU.SelectedItems.Count > 0 Then
            ' affiche la fiche de l'éleve
            gCD_CLI = LV_BORDEREAU.SelectedItems(0).Text
            frmElevesMAJ.ShowDialog()
        End If
    End Sub

    Private Sub InitListeResultats(ByVal ix As Integer)

        Dim rsEleve As ADODB.Recordset = Nothing
        Dim nb As Integer = 0

        ' effacer la listview
        LV_RESULTAT.Items.Clear()

        ' Lire la table EXAMENS_AFF
        szSQL = "CALL spGet_EXAMENS_AFF('" & Format(pDate, "yyyy/MM/dd") & "'," & pNo_exa & ",0)"
        GetRecordset(ctDSN_AEM, szSQL, rs)

        Do While Not rs.EOF
            LV_RESULTAT.Items.Add(rs.Fields("cd_cli").Value)
            LV_RESULTAT.Items(nb).SubItems.Add(nv(rs.Fields("nom").Value))

            ' Lire la fiche Eleves
            szSQL = "CALL spGet_ELEVES_byCD_CLI(" & nv(rs.Fields("cd_cli").Value) & ")"
            GetRecordset(ctDSN_AEM, szSQL, rsEleve)
            If rsEleve.RecordCount > 0 Then
                ' calcule le solde
                LV_RESULTAT.Items(nb).SubItems.Add(rsEleve.Fields("credit").Value - rsEleve.Fields("debit").Value)
            Else
                LV_RESULTAT.Items(nb).SubItems.Add("0.00")
            End If
            ' résultat non saisi, mettre " " 
            If rs.Fields("resultat").Value > 0 Then
                LV_RESULTAT.Items(nb).SubItems.Add(getLibelleByCode("p_statuts_exam", rs.Fields("resultat").Value))
            Else
                LV_RESULTAT.Items(nb).SubItems.Add("")
            End If
            LV_RESULTAT.Items(nb).SubItems.Add(rs.Fields("no_insc").Value)
            LV_RESULTAT.Items(nb).SubItems.Add(nv(rsEleve.Fields("email").Value))
            If rs.Fields("valide").Value Then
                LV_RESULTAT.Items(nb).ForeColor = Color.Green
            End If
            rs.MoveNext()
            nb = nb + 1
        Loop
        ' Close the recordset AND connection.
        rs.Close()
        GB_RESULTAT.Text = "Elèves inscrits [" & nb & "] :"
        ' restaurer la position du curseur avant le init
        setIndice(ix, LV_RESULTAT)

    End Sub

    Private Sub LV_RESULTAT_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles LV_RESULTAT.DoubleClick
        ' Examen déjà validé 
        If chkVALIDE.Checked = True Then
            Exit Sub
        End If

        If LV_RESULTAT.SelectedItems.Count > 0 Then
            ResultatToScreen()
            ' afficher les détails de la formule
            TC_DETAILS.Visible = True
            CB_RESULTAT.Focus()
        End If
    End Sub

    Private Sub LV_RESULTAT_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles LV_RESULTAT.KeyDown
        If e.KeyCode = Keys.Enter Then
            ' touche Enter = DoubleClick
            LV_RESULTAT_DoubleClick(sender, e)
        End If
    End Sub

    Private Sub ResultatToScreen()

        ' CB_RESULTAT.SelectedIndex = -1

        ' Lire l'enreg sélectionné
        szSQL = "CALL spGet_EXAMENS_AFF_byNO_INSC(" & LV_RESULTAT.SelectedItems(0).SubItems(4).Text & ")"
        GetRecordset(ctDSN_AEM, szSQL, rs)
        If rs.RecordCount > 0 Then
            ' résultat non saisi, Proposer BON
            If rs.Fields("resultat").Value > 0 Then
                CB_RESULTAT.SelectedIndex = CB_RESULTAT.FindString(rs.Fields("resultat").Value.ToString)
            Else
                CB_RESULTAT.SelectedIndex = CB_RESULTAT.FindString("10")
            End If

            TE_NO_INSC.Text = rs.Fields("no_insc").Value
        End If
        rs.Close()

    End Sub


    Private Sub BO_ENREGISTRER_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BO_ENREGISTRER.Click

        If CB_RESULTAT.SelectedIndex < 0 Then
            MsgBox("Veuillez saisir un résultat avant d'enregistrer !", MsgBoxStyle.Critical)
            Exit Sub
        End If
        ' maj le staut et le code reussite de la ligne exmane
        szSQL = "CALL spUpd_EXAMENS_AFF_STATUT(" & TE_NO_INSC.Text & "," & getCodeFromCombo(CB_RESULTAT.SelectedItem) & ")"
        ExecQuery(ctDSN_AEM, szSQL)
        ' cacher les détails 
        BO_ANNULER_Click(sender, e)

    End Sub

    Private Sub BO_ANNULER_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BO_ANNULER.Click
        ' cacher les détails 
        TC_DETAILS.Visible = False
        ' réaffiche la liste
        InitListeResultats(LV_RESULTAT.SelectedItems(0).Index)
    End Sub

    Private Sub BO_VALIDER_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BO_VALIDER.Click

        If TE_NOM_MON.Text.Length = 0 Or TE_INSPECTEUR.Text.Length = 0 Then
            MsgBox("Veuillez saisir l'accompagnateur et l'inspecteur de l'examen !", MsgBoxStyle.Critical)
            Exit Sub
        End If

        If MsgBox("Une fois validé, vous ne pourrez plus modifier cet examen." & vbCrLf & _
                  "Etes-vous sûr de vouloir valider cet examen ?", _
                  MsgBoxStyle.YesNo, "Confirmation de la validation") = MsgBoxResult.No Then
            Exit Sub
        End If

        Me.Cursor = Cursors.WaitCursor
        If ValiderExamen() = True Then
            ' marquer l'examen comme validé
            szSQL = "spUpd_EXAMENS_VALIDE('" & Format(pDate, "yyyy/MM/dd") & "'," & pNo_exa & "," & True & ")"
            ExecQuery(ctDSN_AEM, szSQL)
            chkVALIDE.Checked = True
            InitListeResultats(0)
        End If
        Me.Cursor = Cursors.Default

    End Sub

    'Private Sub BO_DEVALIDER_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BO_DEVALIDER.Click
    '    ' Dévalider un examen
    '    If IsUserAuthorised(9) = False Then
    '        Exit Sub
    '    End If

    '    If MsgBox("Cette action va annuler la validation de l'examen." & vbCrLf & _
    '              "Seules les écriture générées par la validation seront supprimées," & vbCrLf & _
    '              "l'historique examen des élèves concernés ne sera pas rétabli." & vbCrLf & _
    '              "Etes-vous sûr de vouloir dé-valider cet examen ?", _
    '              MsgBoxStyle.YesNo, "Confirmation de la dé-validation") = MsgBoxResult.No Then
    '        Exit Sub
    '    End If

    '    Me.Cursor = Cursors.WaitCursor
    '    ' Lire toutes les lignes de l'examen :
    '    ' - supprimer les écritures générés par la validation
    '    ' - marquer la ligne examen comme dévalidée
    '    ' Puis marquer l'examen comme dévalidé
    '    szSQL = "CALL spUpd_EXAMENS_DEVALIDER('" & Format(pDate, "yyyy/MM/dd") & "'," & pNo_exa & ")"
    '    ExecQuery(ctDSN_AEM, szSQL)
    '    Me.Cursor = Cursors.Default

    '    InitListeResultats(0)
    '    chkVALIDE.Checked = False
    'End Sub

    Private Function ValiderExamen() As Boolean

        ValiderExamen = False
        Me.Cursor = Cursors.WaitCursor

        ' Lire EXAMENS_AFF de la journée
        szSQL = "CALL spGet_EXAMENS_AFF('" & Format(pDate, "yyyy/MM/dd") & "'," & pNo_exa & ",0)"
        GetRecordset(ctDSN_AEM, szSQL, rs)

        Do While Not rs.EOF
            ' ligne non encore validée ou non supprimée ?
            If rs.Fields("valide").Value = 0 And rs.Fields("cd_cli").Value > 0 Then

                Dim nResultat As Integer = rs.Fields("resultat").Value
                Dim nReussite As Integer = rs.Fields("reussite").Value
                ' résultat non saisi ? résultat = BON
                If nResultat = 0 Then
                    nResultat = 10
                    nReussite = 1
                    ' maj le statut et le code reussite à BON (=10)
                    szSQL = "CALL spUpd_EXAMENS_AFF_STATUT(" & rs.Fields("no_insc").Value & ",10)"
                    ExecQuery(ctDSN_AEM, szSQL)
                End If
                gCD_CLI = rs.Fields("cd_cli").Value
                ' Lire la fiche Elève
                szSQL = "CALL spGet_ELEVES_byCD_CLI(" & gCD_CLI & ")"
                GetRecordset(ctDSN_AEM, szSQL, rsEleve)
                If rsEleve.RecordCount < 1 Then
                    MsgBox("Elève " & gCD_CLI & " non trouvé !", MsgBoxStyle.Critical)
                    rs.Close()
                    rsEleve.Close()
                    Exit Function
                End If
                ' Lire la FORMULE sélectionnée
                szSQL = "CALL spGet_FORMULES('" & rsEleve.Fields("formule").Value & "')"
                GetRecordset(ctDSN_AEM, szSQL, rsFormule)
                If rsFormule.RecordCount < 1 Then
                    MsgBox("Formule " & rsEleve.Fields("formule").Value & " non trouvée !", MsgBoxStyle.Critical)
                    rsFormule.Close()
                    rsEleve.Close()
                    rs.Close()
                    Exit Function
                End If
                ' si validite conduite expirée, raz les présentations gratuites
                If rsFormule.Fields("duree_cond").Value And IfDate(rsEleve.Fields("fin_contrat_le").Value).Length And _
                    DateDiff(DateInterval.Day, pDate, rsEleve.Fields("fin_contrat_le").Value) < 0 Then
                    nbPresPratGratuit = 0
                Else
                    nbPresPratGratuit = rsFormule.Fields("nbppgratuit").Value
                End If
                ' si validite code expirée, raz les présentations gratuites
                If rsFormule.Fields("duree_code").Value And IfDate(rsEleve.Fields("fin_forfait_code_le").Value).Length Then
                    If DateDiff(DateInterval.Day, pDate, rsEleve.Fields("fin_forfait_code_le").Value) < 0 Then
                        nbPresTheoGratuit = 0
                    Else
                        nbPresTheoGratuit = rsFormule.Fields("nbptgratuit").Value
                    End If
                End If

                ' lire le permis demandé pour controles
                szSQL = "CALL spGet_PERMIS('" & rsEleve.Fields("permis_demande").Value & "')"
                GetRecordset(ctDSN_AEM, szSQL, rsPermis)
                If rsPermis.RecordCount < 1 Then
                    MsgBox("Permis " & rsEleve.Fields("permis_demande").Value & " non trouvée !", MsgBoxStyle.Critical)
                    rsPermis.Close()
                    rsFormule.Close()
                    rsEleve.Close()
                    rs.Close()
                    Exit Function
                End If

                ' si cas à débiter, valider les présentations à l'avance
                If nReussite < 3 Or nResultat < 10 Then
                    szSQL = "UPDATE eleves_cpt SET date_valeur='" & Format(pDate, "yyyy/MM/dd") & _
                            "', mtval=debit WHERE cd_cli=" & gCD_CLI & _
                            " AND date < '" & Format(pDate, "yyyy/MM/dd") & _
                            "' AND date_valeur IS NULL AND (ref='" & rsFormule.Fields("p_prats1").Value & _
                            "' or ref='" & rsFormule.Fields("p_prats").Value & _
                            "' or ref='" & rsFormule.Fields("p_theos").Value & _
                            "' or ref='" & rsFormule.Fields("tfisc").Value & "')"
                    ExecQuery(ctDSN_AEM, szSQL)
                End If
                ' créer une ligne de RESULTAT dans compte élève
                szSQL = "CALL spINS_ELEVES_DEBIT(" & gCD_CLI & ",'" & Format(pDate, "yyyy/MM/dd") & "','',0,'EXAM. " & _
                              pType_exam & ":" & getLibelleByCode("p_statuts_exam", nResultat) & "',1,0," & nResultat & "," & gUserAgence & ",'" & gUserCode & "')"
                ExecQuery(ctDSN_AEM, szSQL)
                ' créer une ligne de débit
                If nReussite = 1 Then
                    CreerLigneReussite()
                Else
                    CreerLigneEchec()
                End If
                ' marquer la ligne examen comme validée
                szSQL = "spUpd_EXAMENS_VALIDE(''," & rs.Fields("no_insc").Value & "," & True & ")"
                ExecQuery(ctDSN_AEM, szSQL)
                ' cocher la case "02 gardé par élèves éventuellement
                szSQL = "CALL spUPD_ELEVES_GARDER_02(" & nReussite & "," & nResultat & ",'" & pType_exam & "','" & _
                              rsPermis.Fields("cat").Value & "'," & IsDate(rsEleve.Fields("tr_p_ok").Value) & "," & gCD_CLI & ")"
                ExecQuery(ctDSN_AEM, szSQL)
                ' mettre à jour l'historique examen de l'élève
                MajHistoExamen(nReussite, nResultat)

                rsPermis.Close()
                rsFormule.Close()
                rsEleve.Close()
            End If
            rs.MoveNext()
        Loop

        rs.Close()
        Me.Cursor = Cursors.Default
        ValiderExamen = True

    End Function

    Private Sub CreerLigneReussite()
        ' Créer une ligne dans compte élève en cas de réussite à l'examen

        szRefADebiter = ""
        ' examen ETG ? oui, debiter une présentation à l'avance
        If ptype_exam = "ETG" Then
            szRefADebiter = rsFormule.Fields("p_prats1").Value
        Else
            ' exman pratique ? oui, debiter une présentation à l'avance
            If Not IsDate(rsEleve.Fields("tr_p_ok").Value) Then   ' ** examen plateau
                If rsPermis.Fields("droute1").Value > 0 Then
                    szRefADebiter = rsFormule.Fields("p_prats").Value
                End If
            End If
        End If
        If szRefADebiter.Length Then
            mtDebit = 10    ' montant non nul
            szIntitule = "*"
            If ptype_exam = "ETG" Then
                ' l'élève a des présentation pratiques gratuites ?
                If nbPresPratGratuit Then
                    ' calculer nb de présentations déjà effectuées
                    szSQL = "SELECT cd_cli from eleves_cpt WHERE cd_cli=" & gCD_CLI & _
                            " AND (ref='" & rsFormule.Fields("p_prats1").Value & _
                            "' or ref='" & rsFormule.Fields("p_prats").Value & "')"
                    GetRecordset(ctDSN_AEM, szSQL, rsCompte)
                    If rsCompte.RecordCount < nbPresPratGratuit Then
                        mtDebit = 0.0
                        szIntitule = "PRES. FORFAIT (" & rs.Fields("resultat").Value & ")"
                    End If
                End If
            Else
                mtDebit = 0.0
                szIntitule = "PRES. FORFAIT (" & rs.Fields("resultat").Value & ")"
            End If
            ' créer une ligne de PRESENTATION dans compte élève
            szSQL = "CALL spINS_ELEVES_DEBIT(" & gCD_CLI & ",'" & Format(pDate, "yyyy/MM/dd") & "','" & szRefADebiter & "'," & _
                     mtDebit & ",'" & szIntitule & "',1,0," & rs.Fields("resultat").Value & "," & gUserAgence & ",'" & gUserCode & "')"
            ExecQuery(ctDSN_AEM, szSQL)
        End If

    End Sub

    Private Sub CreerLigneEchec()

        ' Créer une ligne dans compte élève en cas d'échec à l'examen
        If rs.Fields("resultat").Value > 9 Then
            Exit Sub
        End If

        ' examen ETG ? oui, debiter une présentation à l'avance
        If ptype_exam = "ETG" Then
            szRefADebiter = rsFormule.Fields("p_theos").Value
        Else
            szRefADebiter = rsFormule.Fields("p_prats").Value
        End If

        mtDebit = 10    ' montant non nul
        szIntitule = "*"
        If ptype_exam = "ETG" Then
            ' l'élève a des présentation théoriques gratuites ?
            If nbPresTheoGratuit Then
                ' calculer nb de présentations déjà effectuées
                szSQL = "CALL spGet_ELEVES_CPT_byREF(" & gCD_CLI & ",'" & rsFormule.Fields("p_theos").Value & "',0)"
                GetRecordset(ctDSN_AEM, szSQL, rsCompte)
                If rsCompte.RecordCount < nbPresTheoGratuit Then
                    mtDebit = 0.0
                    szIntitule = "PRES. FORFAIT (" & rs.Fields("resultat").Value & ")"
                End If
            End If
        Else
            ' l'élève a des présentation pratiques gratuites ?
            If nbPresPratGratuit Then
                ' calculer nb de présentations déjà effectuées
                szSQL = "SELECT cd_cli from eleves_cpt WHERE cd_cli=" & gCD_CLI & _
                        " AND (ref='" & rsFormule.Fields("p_prats1").Value & _
                        "' or ref='" & rsFormule.Fields("p_prats").Value & "')"
                GetRecordset(ctDSN_AEM, szSQL, rsCompte)
                If rsCompte.RecordCount < nbPresPratGratuit Then
                    mtDebit = 0.0
                    szIntitule = "PRES. FORFAIT (" & rs.Fields("resultat").Value & ")"
                End If
            End If
        End If

        ' créer une ligne de PRESENTATION dans compte élève
        szSQL = "CALL spINS_ELEVES_DEBIT(" & gCD_CLI & ",'" & Format(pDate, "yyyy/MM/dd") & "','" & szRefADebiter & "'," & _
                 mtDebit & ",'" & szIntitule & "',1,0," & rs.Fields("resultat").Value & "," & gUserAgence & ",'" & gUserCode & "')"
        ExecQuery(ctDSN_AEM, szSQL)

    End Sub

    Private Sub MajHistoExamen(ByVal nReussite As Integer, ByVal nResultat As Integer)
        Dim szText1 As String
        Dim szBody As String
        Dim nAnnulerCode As Integer

        nAnnulerCode = 0
        szText1 = ""
        Select Case nReussite
            Case 1
                ' si REUSSITE
                szText1 = "heureux de vous informer que vous avez réussi"

            Case 2
                ' si ECHEC
                szText1 = "au regret de vous informer de votre échec"
                ' si ECHEC et limite du nb d'échecs atteint
                If rsPermis.Fields("nechecp").Value > 0 Then
                    If (rsEleve.Fields("tr_p_nb").Value + rsEleve.Fields("tr_r_nb").Value Mod rsPermis.Fields("nechecp").Value) = 0 Then
                        ' dépassement nb limite de passage, annulation du code
                        nAnnulerCode = 1
                    End If
                End If

            Case 3
                ' si ni REUSSITE, ni ECHEC, alors pas d'historique
                Exit Sub

        End Select

        Select Case pType_exam
            Case "ETG"
                ' incrementer le nb de passage et la date dernière passage ETG
                szSQL = "CALL spUPD_ELEVES_EXAMEN_ETG(" & nReussite & ",'" & Format(pDate, "yyyy/MM/dd") & "'," & gCD_CLI & ")"

            Case "B"
                ' incrementer le nb de passage et la date dernière passage B
                szSQL = "CALL spUPD_ELEVES_EXAMEN_B(" & nReussite & "," & nAnnulerCode & ",'" & Format(pDate, "yyyy/MM/dd") & "'," & gCD_CLI & ")"

            Case Else
                If rsPermis.Fields("cat").Value = "BE" Then
                    ' incrementer le nb de passage et la date dernière passage B
                    szSQL = "CALL spUPD_ELEVES_EXAMEN_B(" & nReussite & "," & nAnnulerCode & ",'" & Format(pDate, "yyyy/MM/dd") & "'," & gCD_CLI & ")"
                Else
                    ' incrementer le nb de passage et la date dernière passage 2R et GL
                    szSQL = "CALL spUPD_ELEVES_EXAMEN_2R(" & nReussite & "," & IsDate(rsEleve.Fields("tr_p_ok").Value) & "," & _
                            nAnnulerCode & ",'" & Format(pDate, "yyyy/MM/dd") & "'," & gCD_CLI & ")"
                End If
        End Select
        ExecQuery(ctDSN_AEM, szSQL)

        ' envoi une notification par email à l'élève et au payeur
        ' -------------------------------------------------------
        If rsEleve.Fields("email").Value.ToString.Length > 0 Then
            szBody = "<html><body>" & _
                     "<p>Bonjour " & rsEleve.Fields("civilite").Value & " " & rsEleve.Fields("nompren").Value & ",</p>"
            If pType_exam = "ETG" Then
                szBody = szBody & "<p>Nous sommes " & szText1 & " à l’examen THEORIQUE en date du " & pDate.ToLongDateString & ".</p>" & _
                    "<p>Nous restons à votre disposition pour toute information complémentaire.</p>"

            Else
                szBody = szBody & "<p>Nous vous informons que le résultat de votre examen pratique a été envoyé par le centre d’examen.</p>" & _
                     "<p>Vous pouvez consulter ce résultat sur le site suivant :<br />" & _
                     "<a href=""http://www.securite-routiere.gouv.fr/permis-de-conduire/resultats-du-permis-de-conduire"">http://www.securite-routiere.gouv.fr/permis-de-conduire/resultats-du-permis-de-conduire</a>" & _
                     "<p>Pour accéder à votre résultat, munissez-vous auparavant de votre numéro NEPH (indiqué dans votre livret d’apprentissage). " & _
                     "Vous pourrez alors visualiser et télécharger votre CEPC (Certificat d’Examen du Permis de Conduire).</p>" & _
                     "<p>Si votre résultat est favorable, vous pourrez suivre l’avancement de l’édition et de la mise à disposition de votre permis sur le <a href=""https://permisdeconduire.ants.gouv.fr/"">site de l’ANTS</a>.</p>" & _
                     "<p>Si votre résultat est défavorable, veuillez contacter votre agence.</p>"
            End If

            szBody = szBody & "<p>Veuillez agréer nos sincères salutations.</p>" & _
                    "<p>Auto-école MARIETTON</p>" & _
                    "</body></html>"

            SendNotification("Résultat de l'examen du permis de conduire", szBody, _
                    rsEleve.Fields("nompren").Value, rsEleve.Fields("email").Value, _
                    nv(rsEleve.Fields("payeur_nom").Value), nv(rsEleve.Fields("payeur_email").Value), rsEleve.Fields("agence").Value)
        End If


    End Sub

    Private Sub chkVALIDE_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkVALIDE.CheckedChanged
        ' examen validé ? oui, Validation n'est plus possible
        If chkVALIDE.Checked = True Then
            BO_VALIDER.Enabled = False
            ' si user = Administreur, autoriser Dévalidation examen 
            If gUserAcces = 9 Then
                ' BO_DEVALIDER.Enabled = True
            End If
        Else
            BO_VALIDER.Enabled = True
            ' BO_DEVALIDER.Enabled = False
        End If
    End Sub

    Private Sub BO_RECH_MON_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BO_RECH_MON.Click
        'affiche la liste des Moniteurs pour sélection
        frmTablesSearch.pTable = "moniteurs"
        frmTablesSearch.pTitre = "Sélectionner un MONITEUR"
        frmTablesSearch.pCode = TE_CD_MON.Text
        frmTablesSearch.ShowDialog()
        If frmTablesSearch.pCode <> "" Then
            TE_CD_MON.Text = frmTablesSearch.pCode
            TE_NOM_MON.Text = frmTablesSearch.pLibelle
            szSQL = "spUpd_EXAMENS_MONITEUR('" & Format(pDate, "yyyy/MM/dd") & "'," & pNo_exa & ",'" & TE_CD_MON.Text & "')"
            ExecQuery(ctDSN_AEM, szSQL)
        End If

    End Sub

    Private Sub BO_RECH_INSP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BO_RECH_INSP.Click
        frmTablesSearch.pTable = "p_inspecteurs"
        frmTablesSearch.pTitre = "Sélectionner un INSPECTEUR"
        frmTablesSearch.pCode = TE_INSPECTEUR.Text
        frmTablesSearch.ShowDialog()
        If frmTablesSearch.pCode <> "" Then
            TE_INSPECTEUR.Text = frmTablesSearch.pLibelle
            szSQL = "spUpd_EXAMENS_INSPECTEUR('" & Format(pDate, "yyyy/MM/dd") & "'," & pNo_exa & ",'" & TE_INSPECTEUR.Text & "')"
            ExecQuery(ctDSN_AEM, szSQL)
        End If

    End Sub

    Private Sub BO_BORDEREAU_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BO_BORDEREAU.Click
        Dim ix As Integer
        Dim iMax As Integer
        Dim G_Civilite As String = ""
        Dim G_Nom As String = ""
        Dim G_indice As String = ""
        Dim G_DossierNo As String = ""
        Dim D_Civilite As String = ""
        Dim D_Nom As String = ""
        Dim D_indice As String = ""
        Dim D_DossierNo As String = ""

        ' cumuler le nombre d'inscrits pour cet examen
        szSQL = "spUpd_EXAMENS_TOTAL_INSCRITS('" & Format(pDate, "yyyy/MM/dd") & "'," & pNo_exa & ")"
        ExecQuery(ctDSN_AEM, szSQL)

        If ptype_exam = "ETG" Then
            ' RAZ la table T_HEURES pour extraire les eleves de cet examen
            szSQL = "spDel_T_HEURES('" & gUserCode & "')"
            ExecQuery(ctDSN_AEM, szSQL)

            ' balayer les listes de gauche et de droite
            If LV_GAUCHE.Items.Count > LV_DROITE.Items.Count Then
                iMax = LV_GAUCHE.Items.Count
            Else
                iMax = LV_DROITE.Items.Count
            End If
            For ix = 0 To iMax - 1
                If ix < LV_GAUCHE.Items.Count Then
                    ' extraire liste de gauche
                    szSQL = "CALL spGet_ELEVES_byCD_CLI(" & LV_GAUCHE.Items(ix).SubItems(4).Text & ")"
                    GetRecordset(ctDSN_AEM, szSQL, rs)
                    If rs.RecordCount > 0 Then
                        If rs.Fields("civilite").Value = "M." Then
                            G_Civilite = " "
                        Else
                            G_Civilite = "X"
                        End If
                        If rs.Fields("nom_jf").Value.ToString.Length > 0 Then
                            G_Nom = Mid(Trim(rs.Fields("nom_jf").Value) & " " & get1erPrenom(rs.Fields("prenom").Value), 1, 30)
                        Else
                            G_Nom = rs.Fields("nompren").Value
                        End If
                        G_DossierNo = rs.Fields("dossier_no").Value
                        G_indice = LV_GAUCHE.Items(ix).SubItems(2).Text
                    End If
                    rs.Close()
                Else
                    G_Civilite = " "
                    G_Nom = " "
                    G_indice = " "
                    G_DossierNo = " "
                End If

                If ix < LV_DROITE.Items.Count Then
                    ' extraire liste de droite
                    szSQL = "CALL spGet_ELEVES_byCD_CLI(" & LV_DROITE.Items(ix).SubItems(4).Text & ")"
                    GetRecordset(ctDSN_AEM, szSQL, rs)
                    If rs.RecordCount > 0 Then
                        If rs.Fields("civilite").Value = "M." Then
                            D_Civilite = " "
                        Else
                            D_Civilite = "X"
                        End If
                        If rs.Fields("nom_jf").Value.ToString.Length > 0 Then
                            D_Nom = Mid(Trim(rs.Fields("nom_jf").Value) & " " & get1erPrenom(rs.Fields("prenom").Value), 1, 30)
                        Else
                            D_Nom = rs.Fields("nompren").Value
                        End If
                        D_DossierNo = rs.Fields("dossier_no").Value
                        D_indice = LV_DROITE.Items(ix).SubItems(2).Text
                    End If
                    rs.Close()
                Else
                    D_Civilite = " "
                    D_Nom = " "
                    D_indice = " "
                    D_DossierNo = " "
                End If

                szSQL = "INSERT INTO T_HEURES (cd_uti,age_uti,date,no_exa,heure,e_civ_g,e_nom_g,e_indice_g,e_dossier_no_g,e_civ_d,e_nom_d,e_indice_d,e_dossier_no_d) VALUE ('" & _
                        gUserCode & "'," & pAgence & ",'" & Format(pDate, "yyyy/MM/dd") & "'," & pNo_exa & "," & ix & ",'" &
                        G_Civilite & "','" & nq(G_Nom) & "','" & G_indice & "','" & G_DossierNo & "','" & _
                        D_Civilite & "','" & nq(D_Nom) & "','" & D_indice & "','" & D_DossierNo & "')"
                ExecQuery(ctDSN_AEM, szSQL)
            Next ix
            ' afficher le bordereau théorique
            FrmViewReport.pCodeEtat = 11
            FrmViewReport.pParamRPT = ""  ' gUserCode
        Else
            ' afficher le bordereau pratique
            gDate_debut = pDate
            gNumero = pNo_exa
            FrmViewReport.pCodeEtat = 10
            FrmViewReport.pParamRPT = ""
        End If
        FrmViewReport.ShowDialog()

    End Sub

    Private Sub BO_ELEVE_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BO_ELEVE.Click
        ' affiche la fiche de l'éleve
        If LV_BORDEREAU.SelectedItems.Count > 0 Then
            gCD_CLI = LV_BORDEREAU.SelectedItems(0).SubItems(0).Text
            frmElevesMAJ.ShowDialog()
        End If

    End Sub

    Private Sub BO_ELEVE2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BO_ELEVE2.Click
        ' affiche la fiche de l'éleve
        If LV_RESULTAT.SelectedItems.Count > 0 Then
            gCD_CLI = LV_RESULTAT.SelectedItems(0).SubItems(0).Text
            frmElevesMAJ.ShowDialog()
        End If

    End Sub

    Private Sub LV_GAUCHE_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles LV_GAUCHE.DragDrop

        Dim myItems() As ListViewItem = e.Data.GetData("System.Windows.Forms.ListViewItem()")
        Dim i As Integer = 0

        ' Examen déjà validé 
        If chkVALIDE.Checked = True Then
            Exit Sub
        End If

        For Each myItem As ListViewItem In myItems
            ' Add the item to the target list.  
            Dim lvItem As ListViewItem = sender.Items.Add(myItem.Text)

            'Loop through the sub items AND add it to the destination Listview  
            Dim j As Integer
            For j = 1 To myItem.SubItems.Count - 1
                lvItem.SubItems.Add(myItem.SubItems(j).Text)
            Next

            ' mettre l'élève dans la colonne de gauche
            szSQL = "update EXAMENS_AFF set ordre=1 WHERE no_insc=" & LV_DROITE.SelectedItems(0).SubItems(3).Text
            ExecQuery(ctDSN_AEM, szSQL)
            ' et le supprimer de la colonne de 
            LV_DROITE.Items.Remove(LV_DROITE.SelectedItems.Item(0))
            i += 1
        Next

    End Sub

    Private Sub LV_GAUCHE_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles LV_GAUCHE.DragEnter
        ' Check for the custom DataFormat ListViewItem array.  
        If e.Data.GetDataPresent("System.Windows.Forms.ListViewItem()") Then
            e.Effect = DragDropEffects.Move
        Else
            e.Effect = DragDropEffects.None
        End If
    End Sub

    Private Sub LV_GAUCHE_ItemDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles LV_GAUCHE.ItemDrag
        Dim myItems(sender.SelectedItems.Count - 1) As ListViewItem
        Dim i As Integer = 0

        ' Loop though the SelectedItems collection for the source.  
        For Each myItem As ListViewItem In sender.SelectedItems
            ' Add the ListViewItem to the array of ListViewItems.  
            myItems(i) = myItem
            i = i + 1
        Next
        ' Create a DataObject containg the array of ListViewItems.  
        sender.DoDragDrop(New DataObject("System.Windows.Forms.ListViewItem()", myItems), DragDropEffects.Move)
    End Sub

    Private Sub LV_DROITE_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles LV_DROITE.DragDrop

        Dim myItems() As ListViewItem = e.Data.GetData("System.Windows.Forms.ListViewItem()")
        Dim i As Integer = 0

        ' Examen déjà validé 
        If chkVALIDE.Checked = True Then
            Exit Sub
        End If

        For Each myItem As ListViewItem In myItems
            ' Add the item to the target list.  
            Dim lvItem As ListViewItem = sender.Items.Add(myItem.Text)

            'Loop through the sub items AND add it to the destination Listview  
            Dim j As Integer
            For j = 1 To myItem.SubItems.Count - 1
                lvItem.SubItems.Add(myItem.SubItems(j).Text)
            Next

            ' mettre l'élève dans la colonne de droite
            szSQL = "update EXAMENS_AFF set ordre=2 WHERE no_insc=" & LV_GAUCHE.SelectedItems(0).SubItems(3).Text
            ExecQuery(ctDSN_AEM, szSQL)
            ' et le supprimer de la colonne de gauche
            LV_GAUCHE.Items.Remove(LV_GAUCHE.SelectedItems.Item(0))
            i += 1
        Next

    End Sub

    Private Sub LV_DROITE_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles LV_DROITE.DragEnter
        ' Check for the custom DataFormat ListViewItem array.  
        If e.Data.GetDataPresent("System.Windows.Forms.ListViewItem()") Then
            e.Effect = DragDropEffects.Move
        Else
            e.Effect = DragDropEffects.None
        End If
    End Sub

    Private Sub LV_DROITE_ItemDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles LV_DROITE.ItemDrag
        Dim myItems(sender.SelectedItems.Count - 1) As ListViewItem
        Dim i As Integer = 0

        ' Loop though the SelectedItems collection for the source.  
        For Each myItem As ListViewItem In sender.SelectedItems
            ' Add the ListViewItem to the array of ListViewItems.  
            myItems(i) = myItem
            i = i + 1
        Next
        ' Create a DataObject containg the array of ListViewItems.  
        sender.DoDragDrop(New DataObject("System.Windows.Forms.ListViewItem()", myItems), DragDropEffects.Move)
    End Sub

    Private Sub BO_CONVOCATION_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BO_CONVOCATION.Click
        If LV_INSCRITS.SelectedItems.Count > 0 Then
            ' imprimer la convocation
            gNumero = LV_INSCRITS.SelectedItems(0).SubItems(8).Text
            FrmViewReport.pCodeEtat = 12
            FrmViewReport.pParamRPT = ""
            FrmViewReport.ShowDialog()
        End If

    End Sub

    Private Sub BO_CONVOCATION_GL_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BO_CONVOCATION_GL.Click

        If LV_INSCRITS.SelectedItems.Count > 0 Then
            ' imprimer la convocation GL
            gNumero = LV_INSCRITS.SelectedItems(0).SubItems(8).Text
            FrmViewReport.pCodeEtat = 30
            FrmViewReport.pParamRPT = ""
            FrmViewReport.ShowDialog()
        End If

    End Sub

    Private Sub CB_LIEUX_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles CB_LIEUX.SelectedValueChanged
        TE_ADRESSE.Text = getAdresse(CB_LIEUX.SelectedItem.ToString)
    End Sub

    Private Sub BO_ADD_LIGNE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BO_ADD_LIGNE.Click
        ' Examen déjà validé 
        If chkVALIDE.Checked = True Then
            Exit Sub
        End If
        ' place encore dispo ?
        If TE_INSCRITS.Text < 1 Then
            MsgBox("Il n'y a plus de place disponible !", MsgBoxStyle.Critical)
            Exit Sub
        End If
        frmExamensINS.pNo_exa = pNo_exa
        frmExamensINS.pDate = pDate
        frmExamensINS.pAgence = pAgence
        frmExamensINS.pNoInscrit = 0
        frmExamensINS.pTypeExam = ptype_exam
        frmExamensINS.pDispo = TE_INSCRITS.Text
        frmExamensINS.ShowDialog()
        ' réaffiche la viewlist
        InitListeInscrits(LV_INSCRITS.Items.Count)
    End Sub

    Private Sub BO_SAVE_Click(sender As System.Object, e As System.EventArgs) Handles BO_SAVE.Click

        ' mise à jour 
        szSQL = "CALL spUpd_EXAMENS('" & pType_exam & "','" & Format(pDate, "yyyy/MM/dd") & "'," & pNo_exa & ",'" & _
                 pAgence & "','" & Format(TE_DATE.Value, "yyyy/MM/dd") & "','" & Format(TE_HEURE.Value, "HH:mm") & "'," & _
                 TE_NO_EXA.Value & ",'" & TE_CLE.Text & "','" & CB_LIEUX.SelectedItem.ToString & "','" & _
                 TE_ADRESSE.Text & "','" & Mid(CB_SOCIETES.SelectedItem.ToString, 1, 1) & "','" & CB_AGENCES.SelectedIndex + 1 & "'," & _
                 TE_TOTAL.Value & "," & TE_INSCRITS.Value & ",'" & gUserCode & "')"
        If ExecQuery(ctDSN_AEM, szSQL) Then
            ' fermer la fenetre
            Me.Close()
        End If

    End Sub

    Private Sub BO_SUPPRIMER_Click(sender As System.Object, e As System.EventArgs) Handles BO_SUPPRIMER.Click

        ' Niveau d'autorisation ?
        If IsUserAuthorised(6) = False Then
            Exit Sub
        End If
        ' Examen déjà validé ?
        If chkVALIDE.Checked = True Then
            MsgBox("Cet examen est déjà validé, suppression impossible !", MsgBoxStyle.Critical)
            Exit Sub
        End If
        ' si inscrits existe, interdire suppression
        If TE_INSCRITS.Value < TE_TOTAL.Value Then
            MsgBox("L'examen a déjà un ou des inscrits, suppression impossible !", MsgBoxStyle.Critical)
            Exit Sub
        End If
        ' suppression
        deleteEnregistrement("EXAMENS", "l'examen du " & TE_DATE.Value & " à " & CB_LIEUX.SelectedItem.ToString, Format(pDate, "yyyy/MM/dd"), pNo_exa, pAgence)
        ' réaffiche la viewlist
        Me.Close()

    End Sub

End Class